package com.cskaoyan.javase.oop2.polymorphic10.exercise4;

/**
 * @description: 孔子装爹
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 *   举一个形象的例子
 *  孔子（Confucius）装爹
 *  孔子他爹可以教JavaSE，他爹48岁
 *  孔子会教《论语》，孔子28岁，孔子还会打游戏
 *
 *  现在Java培训很火，孔子爹很吃香，经常有人找孔子他爹去上课，给的钱也很多
 *  有一天孔子爹已经出去上课了，但是还有人来请孔子爹去教Java，这个时候没人找孔子学论语，孔子在家里没事干。然后孔子看到来的人给的钱不少，于是孔子想着装成他爹的样子去赚钱。
 *
 * 孔子装上他老爹的衣服，戴上成熟的胡子，梳上大人的大型，然后来的人就以为这个人就是孔子爹了
 * ConfuciusFather cf = new Confucius();
 * 现在来的人问，孔子爹，您老多大年纪了
 * 孔子现在是他爹，他敢说实话吗
 * cf.age = 48; 成员变量运行时看左边
 * 接下来孔子到了人家，开始上课，一旦开始上课，露馅了
 * cf.teach() 教论语
 * 这就对于成员方法而言，运行时看右边
 * 孔子说：半部论语治天下，Java程序员学点论语没问题
 * 温故而知新
 * 终于熬了半天，孔子下课了，孔子现在很焦虑
 * 于是掏出手机，想玩一把游戏
 * //cf.playGame() 编译时看左边
 * 这个时候孔子是他爹，他爹不会打游戏，他这个时候也不能打游戏
 * 接下来好不容易课上完了
 * 孔子慌忙跑回家，换个自己的衣服，头发胡子都恢复原样
 * Confucius c = (Confucius)cf 向下转型 强制类型转换
 * 于是孔子就恢复了真实年龄，也能打游戏了
 * c.age = 28
 * c.playGame()
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        ConfuciusFather cf = new Confucius();
        System.out.println(cf.age);//48
        cf.teach();//论语
        //cf.playGame(); 不能打游戏，因为父类没这个成员
        Confucius c = (Confucius) cf;
        System.out.println(c.age);//28
        c.playGame();
    }
}

class ConfuciusFather{
    int age = 48;
    public void teach(){
        System.out.println("我要教Java");
    }
}
class Confucius extends ConfuciusFather{
    int age = 28;
    public void playGame(){
        System.out.println("孔子喜欢玩大乱斗！");
    }
    @Override
    public void teach() {
        System.out.println("我会教论语");
    }
}
